/* jq extension for PHP */

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

#include "php.h"
#include "ext/standard/info.h"
#include "php_jq.h"
#include "jq_arginfo.h"

#include <jq.h>
#include <string.h>

/* For compatibility with older PHP versions */
#ifndef ZEND_PARSE_PARAMETERS_NONE
#define ZEND_PARSE_PARAMETERS_NONE() \
	ZEND_PARSE_PARAMETERS_START(0, 0) \
	ZEND_PARSE_PARAMETERS_END()
#endif

/* {{{ void test1() */
PHP_FUNCTION(test1)
{
	ZEND_PARSE_PARAMETERS_NONE();

	php_printf("The extension %s is loaded and working!\r\n", "jq");
}
/* }}} */

/* {{{ string test2( [ string $var ] ) */
PHP_FUNCTION(test2)
{
	char *var = "World";
	size_t var_len = sizeof("World") - 1;
	zend_string *retval;

	ZEND_PARSE_PARAMETERS_START(0, 1)
		Z_PARAM_OPTIONAL
		Z_PARAM_STRING(var, var_len)
	ZEND_PARSE_PARAMETERS_END();

	retval = strpprintf(0, "Hello %s", var);

	RETURN_STR(retval);
}
/* }}}*/

/* {{{ PHP_RINIT_FUNCTION */
PHP_RINIT_FUNCTION(jq)
{
#if defined(ZTS) && defined(COMPILE_DL_JQ)
	ZEND_TSRMLS_CACHE_UPDATE();
#endif
	return SUCCESS;
}
/* }}} */

/* {{{ PHP_MINFO_FUNCTION */
PHP_MINFO_FUNCTION(jq)
{
	php_info_print_table_start();
	php_info_print_table_header(2, "jq support", "enabled");
	php_info_print_table_row(2, "jq version", PHP_JQ_VERSION);
	php_info_print_table_end();
}
/* }}} */

/* {{{ 处理 JSON 数据使用 jq 过滤器 */
PHP_FUNCTION(jq_process)
{
	char *json = NULL;
	size_t json_len;
	char *filter = NULL;
	size_t filter_len;

	ZEND_PARSE_PARAMETERS_START(2, 2)
		Z_PARAM_STRING(json, json_len)
		Z_PARAM_STRING(filter, filter_len)
	ZEND_PARSE_PARAMETERS_END();

	jq_state *jq = jq_init();
	if (jq == NULL) {
		zend_throw_error(NULL, "无法初始化 jq");
		RETURN_FALSE;
	}

	// 编译 jq 过滤器
	int compiled = jq_compile(jq, filter);
	if (!compiled) {
		jq_teardown(&jq);
		zend_throw_error(NULL, "jq 过滤器编译失败: %s", filter);
		RETURN_FALSE;
	}

	// 解析 JSON 输入
	jv input = jv_parse(json);
	if (!jv_is_valid(input)) {
		jv_free(input);
		jq_teardown(&jq);
		zend_throw_error(NULL, "JSON 解析失败");
		RETURN_FALSE;
	}

	// 处理结果
	jq_start(jq, input, 0);
	jv result;

	zval return_array;
	array_init(&return_array);

	while (jv_is_valid(result = jq_next(jq))) {
		// 将结果转换为字符串并添加到返回数组
		jv json_str = jv_dump_string(result, 0);
		const char *str = jv_string_value(json_str);
		add_next_index_string(&return_array, str);
		jv_free(json_str);
	}

	// 检查是否有错误
	if (jv_invalid_has_msg(jv_copy(result))) {
		jv msg = jv_invalid_get_msg(result);
		const char *err_msg = jv_string_value(msg);
		jv_free(msg);
		jq_teardown(&jq);
		zend_throw_error(NULL, "jq 处理错误: %s", err_msg);
		zval_ptr_dtor(&return_array);
		RETURN_FALSE;
	}

	jv_free(result);
	jq_teardown(&jq);

	// 如果数组只有一个元素，直接返回它
	if (zend_array_count(Z_ARRVAL(return_array)) == 1) {
		zval *first = zend_hash_index_find(Z_ARRVAL(return_array), 0);
		if (first) {
			zval result_copy;
			ZVAL_COPY(&result_copy, first);
			zval_ptr_dtor(&return_array);
			RETURN_ZVAL(&result_copy, 0, 1);
		}
	}

	RETURN_ZVAL(&return_array, 0, 1);
}
/* }}} */

/* {{{ 获取 jq 库版本 */
PHP_FUNCTION(jq_version)
{
	ZEND_PARSE_PARAMETERS_NONE();

	// jq 库没有提供获取版本的功能，返回固定字符串
	// 注意：如果 jq 库更新了 API，可能需要修改此处
#ifdef JQ_VERSION
	RETURN_STRING(JQ_VERSION);
#else
	RETURN_STRING("未知 (编译时静态版本)");
#endif
}
/* }}} */

/* {{{ jq_module_entry */
zend_module_entry jq_module_entry = {
	STANDARD_MODULE_HEADER,
	"jq",					/* 扩展名称 */
	ext_functions,			/* 扩展函数表 */
	NULL,					/* PHP_MINIT - 模块初始化 */
	NULL,					/* PHP_MSHUTDOWN - 模块关闭 */
	PHP_RINIT(jq),			/* PHP_RINIT - 请求初始化 */
	NULL,					/* PHP_RSHUTDOWN - 请求结束 */
	PHP_MINFO(jq),			/* PHP_MINFO - 模块信息 */
	PHP_JQ_VERSION,			/* 版本 */
	STANDARD_MODULE_PROPERTIES
};
/* }}} */

#ifdef COMPILE_DL_JQ
# ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
# endif
ZEND_GET_MODULE(jq)
#endif
